/**
* @author Lourdes Sanchez
* @author Eugenia Jose
* @author Esteban Castro
* @author Carlos Fernandez
* @author Fernando Turon
* @version 1.0 01-05-12
*
* La clase GestorPregunta se refiere a la capa de negocio relativa al sistema de Pregunta de la aplicación
*
* @see ....
*/

package edu.uoc.tds.pec4.server.bbdd;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Pregunta;
import java.rmi.RemoteException;


public class GestorPregunta{
    //Fernando
    //Atributo para gestionar el servicio de acceso remoto
    RemotoInterface remoto;
    String schema;

    //Fernando
    /**
     * Constructor sin parámetros de la clase GestorPrueba.
     * Crea una instancia de GestorPrueba.
     * {pre: se recibe como parametro la instancia del servidor remoto}
     * {post: asigna el servidor remoto a la instancia de GestorPrueba que se va utilizar en toda la clase}
     */
    public GestorPregunta(RemotoInterface remoto) throws RemoteException{
        this.remoto = remoto;
        this.schema = this.remoto.getSchema();
    }

    //Fernando
    /**
     * Metodo para obtener una lista de Preguntas
     * {pre: un conjunto de datos de Pregunta}
     * {post: una lista correspondiente a las Preguntas
     */
    public List<Pregunta> getListaPreguntas(int numeroPreguntas) throws RemoteException{
        //Inicializamos las variables a utilizar
        List<Pregunta> lista = new ArrayList<Pregunta>();
	String sqlString = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Establecemos la sentencia para obtener una lista de resultados
        sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "pregunta "
                + "LIMIT "
                + numeroPreguntas
                + ";";

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);

            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el mÃ©todo
            while(resultSet.next()){
                Pregunta pregunta = new Pregunta();

                pregunta.setIdPregunta(resultSet.getInt("id_pregunta"));
		pregunta.setTextoPregunta(resultSet.getString("texto_pregunta"));

                lista.add(pregunta);
            }
        }

        /** Capturamos excepciones asociadas al acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorpregunta.errorBBDD"), GestorIdiomas.getMessage("gestorpegunta.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorpregunta.errorBBDD"));
        }

        /** Capturamos excepciones de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorpegunta.error"), GestorIdiomas.getMessage("gestorpegunta.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorpegunta.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepciones de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorpegunta.error"), GestorIdiomas.getMessage("gestorpegunta.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorpegunta.error"));
            }
        }

        //devolvemos la lista de pruebas generada
        return lista;
    }

    //Esteban
    /**
     * Metodo para obtener una Pregunta
     * {pre: un id_pregunta
     * {post: una Pregunta
     */
    public Pregunta getPregunta(int id_pregunta) {
        //Inicializamos las variables a utilizar
        Pregunta pregunta = new Pregunta();

        String sqlString = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Establecemos la sentencia para obtener una lista de resultados
        sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "pregunta "
                + "where "
                + "id_pregunta = ?;";

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, id_pregunta);
            
            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el mÃ©todo
            while(resultSet.next()){
                //Pregunta pregunta = new Pregunta();

                pregunta.setIdPregunta(resultSet.getInt("id_pregunta"));
		pregunta.setTextoPregunta(resultSet.getString("texto_pregunta"));

                //lista.add(pregunta);
            }
        }

        /** Capturamos excepciones asociadas al acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorpregunta.errorBBDD"), GestorIdiomas.getMessage("gestorpegunta.errorTitulo"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepciones de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorpegunta.error"), GestorIdiomas.getMessage("gestorpegunta.errorTitulo"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepciones de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                JOptionPane.showMessageDialog(null,  GestorIdiomas.getMessage("gestorpegunta.error"), GestorIdiomas.getMessage("gestorpegunta.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }
        }

        //devolvemos la lista de pruebas generada
        return pregunta;
    }
}
